package com.cook.service;

import com.cook.dto.recipes.TagsDTO;
import com.cook.entity.Tags;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cook.vo.recipes.TagsVO;

import java.util.List;
import java.util.Map;

/**
* @author black-white spider
* @description 针对表【tags(食谱标签表)】的数据库操作Service
* @createDate 2025-10-27 19:55:23
*/
public interface TagsService extends IService<Tags> {

        /**
         * 分页查询标签列表
         * @param pageNum 页码
         * @param pageSize 每页数量
         * @return 分页结果
         */
        Map<String, Object> getTagsWithPage(Integer pageNum, Integer pageSize);

        /**
         * 根据类型分页查询标签
         * @param type 标签类型
         * @param pageNum 页码
         * @param pageSize 每页数量
         * @return 分页结果
         */
        Map<String, Object> getTagsByType(String type, Integer pageNum, Integer pageSize);

        /**
         * 根据标签ID查询菜谱列表
         * @param tagId 标签ID
         * @param pageNum 页码
         * @param pageSize 每页数量
         * @return 分页结果
         */
        Map<String, Object> getRecipesByTagId(Long tagId, Integer pageNum, Integer pageSize);

        /**
         * 根据菜谱ID查询标签列表
         * @param recipeId 菜谱ID
         * @return 标签列表
         */
        List<TagsVO> getTagsByRecipeId(Long recipeId);

        /**
         * 添加标签
         * @param tagsDTO 标签DTO
         * @return 标签ID
         */
        Long addTag(TagsDTO tagsDTO);

        /**
         * 添加菜谱标签关联
         * @param recipeId 菜谱ID
         * @param tagId 标签ID
         * @return 是否成功
         */
        boolean addRecipeTag(Long recipeId, Long tagId);

        /**
         * 删除标签
         * @param tagId 标签ID
         * @return 是否成功
         */
        boolean deleteTag(Long tagId);

        /**
         * 删除菜谱标签关联
         * @param recipeId 菜谱ID
         * @param tagId 标签ID
         * @return 是否成功
         */
        boolean deleteRecipeTag(Long recipeId, Long tagId);

        /**
         * 统计不同标签名称的数量
         * @return 标签名称统计列表
         */
        List<Map<String, Object>> countTagsByName();

        /**
         * 根据类型统计标签名称的数量
         * @param type 标签类型
         * @return 标签名称统计列表
         */
        List<Map<String, Object>> countTagsByNameAndType(String type);

        /**
         * 查询所有标签列表
         */
        Map<String, Object> getTags();
}
